iT邦幫忙

2021 iThome 鐵人賽

DAY 7
0
Software Development

都是 P 開頭的程式語言,你是在 py 啥啦系列 第 7

[07] [Flask 快速上手筆記] 06. Cookie and Session

  • 分享至 

  • xImage
  •  

Cookies

要使用 cookies 可以使用 cookies 屬性

設定 cookie

透過 set_cookie 方法

from flask import make_response

@app.route('cookie/set/')
def index():
    resp = make_response('Setting cookie!')
    resp.set_cookie('username', '')
    return resp

可以看到我們設定了一個叫做username內容是the username的 cookie

讀取 cookie

透過 get 方法取得 cookie 內容

@app.route('/cookie/get/')
def cookie_get():
    username = request.cookies.get('username')
    # use cookies.get(key) instead of cookies[key] to not get a
    # KeyError if the cookie is missing.
    return f'cookie username = {username}'

刪除 cookie

只需要把 cookie 的expires設為 0 就自動刪除了!


Session

在使用 session 之前需要設定一組密鑰作為加密使用
好的密鑰應該是隨機產生,可以使用指令產生一組隨機的字串作為密鑰

python -c 'import os; print(os.urandom(16))'
from flask import session, redirect, url_for

# Set the secret key to some random bytes. Keep this really secret!
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'

@app.route('/session/')
def session_index():
    if 'username' in session:
        return f'Logged in as {session["username"]}'
    return 'You are not logged in'

@app.route('/session/login/', methods=['GET', 'POST'])
def session_login():
    if request.method == 'POST':
        session['username'] = request.form['username']
        return redirect(url_for('session_index'))
    return '''
        <form method="post">
            <p><input type=text name=username>
            <p><input type=submit value=Login>
        </form>
    '''

@app.route('/session/logout/')
def session_logout():
    # remove the username from the session if it's there
    session.pop('username', None)
    return redirect(url_for('session_index'))

流程展示

一開始進入畫面,因為我們的 session 裡面沒有 username 這個鍵值
所以顯示尚未登入

使用 GET 方法存取了 login 頁面,顯示表單內容

按下按鈕後發送 POST 請求到當前頁面
路由判斷是 POST 請求,建立 session 並且重新跳轉到初始畫面
而初始畫面這次就有取得 session 中的 username 鍵值,所以顯示對應的值

在 /logout/ 路由中,使用session.pop()刪除指定的 session
那個None是什麼意思呢?如果 session key 不存在會引發 KeyError
而給他一個 None 作為預設值的話就可以避免這個問題

因為 Session 這個類別是一種 Dict 型別:dict.pop()
pop(key[, default]) 當 key 存在的時候會移除他並且回傳內容
若是不存在則回傳 default 內容,如果這時候 default 不存在就會引發 KeyError


上一篇
[06] [Flask 快速上手筆記] 05. 發送請求與文件上傳
下一篇
[08] [Flask 快速上手筆記] 07. 重新導向x狀態碼xJSON
系列文
都是 P 開頭的程式語言,你是在 py 啥啦30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言